翻译

您所在的位置:网站首页 memory sentence patterns翻译 翻译

翻译

2024-01-04 03:59| 来源: 网络整理| 查看: 265

本地化:如何创建语言文件¶

一旦标记了应用程序的字符串文字以供以后翻译,就需要写入(或获取)翻译。这里介绍一下方法。

消息文件¶

首先需要为新语言创建 message file 文件。消息文件是一个纯文本文件,代表一种语言,它包含所有可用的翻译字段以及如何以给定语言表示。消息文件扩展名是 .po 文件。

Django 附带的工具 django-admin makemessages 会自动创建并保存这些文件。

Gettext 实用程序

makemessages 命令(和稍后讨论的 compilemessages )使用来自 GNU 文字工具集的命令行:xgettext, msgfmt, msgmerge 和 msguniq 。

gettext 实用工具集支持的最低版本是 0.15 。

要创建或更新消息文件,请运行此命令:

django-admin makemessages -l de

...其中 de 是你要创建的消息文件的 locale name 。例如,pt_BR 是葡萄牙语,de_AT 是奥地利德语,id 是印尼语。

脚本应该从以下两个位置之一来运行:

你的 Django 项目的根目录(就是包含 manage.py 的那个目录)。 Django app的根目录。

脚本会遍历你的项目源代码树或者应用程序源代码库,并抽出所有要被翻译的字符串(查看 Django 如何发现翻译 并确保 LOCALE_PATHS 被正确设置)。它在 locale/LANG/LC_MESSAGES 目录中创建(或更新)消息文件。以德语为例,这个文件会是 locale/de/LC_MESSAGES/django.po 。

在项目的根目录执行 makemessages 命令时,提取的字符串将自动分发到合适的消息文件。这就是说,从包含 locale 目录的 app 文件中提取的字符串将进入该目录下的消息文件中。从不包含任何 locale 目录的 app 文件中提取的字符串将进入 LOCALE_PATHS 中列出的第一个目录下的消息文件,如果 LOCALE_PATHS 为空,则会报错。

默认情况下,django-admin makemessages 会检查具有 .html、.txt 或 .py 文件扩展名的每个文件。如果您想覆盖此默认设置,请使用 --extension 或 -e 选项来指定要检查的文件扩展名:

django-admin makemessages -l de -e txt

用逗号分隔多个扩展名,并/或多次使用 -e 或 --extension:

django-admin makemessages -l de -e html,txt -e xml

警告

从 JavaScript 源码中创建消息文件时(creating message files from JavaScript source code),你需要使用特别的 djangojs 域,而不是 -e js 。

使用 Jinja2 模板?

makemessages 不识别Jinja2模板的语法。要从包含Jinja2模板的项目中提取字符串,需要使用 Babel 的 Message Extracting 。

以下是一个示例的 babel.cfg 配置文件:

# Extraction from Python source files [python: **.py] # Extraction from Jinja2 templates [jinja2: **.jinja] extensions = jinja2.ext.with_

确保列出所有正在使用的扩展名。否则Babel不会识别这些扩展名定义的标签,并会完全忽略包含它们的Jinja2模板。

Babel提供了与 makemessages 类似的功能,通常可以替换它,并且不会依赖 gettext 。获取更多信息,请查阅关于使用消息目录( working with message catalogs )的文档。

没有 gettext?

如果你还没有安装 gettext ,makemessages 将创建一个空文件。如果是这种情况,要么安装 gettext ,要么复制英文消息文件(如果可用) (locale/en/LC_MESSAGES/django.po) 并将其作为起点,即一个空的翻译文件。

在 Windows 上工作?

如果你正在使用Windows并且需要安装 GNU gettext 程序以便 makemessages 工作,请参阅 Windows 上的 gettext 了解更多信息。

每个 .po 文件包含少量的元数据(例如翻译维护者的联系方式等等)以及大量的翻译文件 —— 要翻译的字符串以及实际翻译的字段之间的映射。

例如,如果 Djanog 程序包含一段 "Welcome to my site." 的翻译字符串,像这样:

_("Welcome to my site.")

... 然后 django-admin makemessages 将创建一个包含以下代码片段的 .po 文件 —— 一条消息:

#: path/to/python/module.py:23 msgid "Welcome to my site." msgstr ""

快速解释:

msgid 是显示在源代码中需要翻译的字符串。不要改动它。 msgstr 是你翻译后的字符串。一开始它是空的,因此你需要填充它。确保在翻译中保留引号。 为了方便,每个消息包含以前缀为 # 且位于 msgid 行上方的注释行的形式的注释行,这个注释行报货文件名和需要翻译字符串的行号。

长消息是特殊的情况。这里,在 msgstr (or msgid) 后的第一个字符串是空字符串。然后内容本身就会在接下来的几行中以每行一串的形式写出来。这些字符串被直接连接起来。不要忘了字符串中尾部的空格,否则,它们会被粘贴在一起而不留空白!

注意你的字符集

由于 gettext 工具内部的工作方式以及我们希望在 Django 核心和您的应用程序中允许非 ASCII 源字符串,您 必须 使用 UTF-8 作为您的 .po 文件的编码(在创建 .po 文件时的默认编码)。这意味着每个人都将使用相同的编码,这在 Django 处理 .po 文件时非常重要。

模糊条目

当翻译是从例如已翻译的字符串中推断出来的时候,:djadmin:`makemessages`有时会生成标记为“模糊”的翻译条目。在默认情况下,模糊条目**不会**被 :djadmin:`compilemessages`处理。

要重新检查所有源代码和模板以查找新的翻译字符串,并更新 所有 语言的消息文件,请运行以下命令:

django-admin makemessages -a 编译消息文件¶

创建消息文件后,以及每次修改它时,你需要把它编译成更有效的形式,以供 gettext 使用。使用 django-admin compilemessages 工具来执行此操作。

这个工具会运行在所有可用的 .po 文件上,并创建 .mo 文件,这些文件是经过优化以供 gettext 使用的二进制文件。在与您运行 django-admin makemessages 的相同目录中,可以像这样运行 django-admin compilemessages:

django-admin compilemessages

这就行了。可以使用你的翻译文件了。

在 Windows 上工作?

如果你正在使用Windows并且需要安装 GNU gettext 程序以便 django-admin compilemessages 工作,请参阅 Windows 上的 gettext 了解更多信息。

.po 文件:编码和 BOM 的使用。

Django 只支持使用UTF-8编码的 .po 文件并且没有任何BOM(字节顺序标记),因此如果文本编辑器默认在文件开头添加这个标记,那么你需要重新配置它.

疑难解答: gettext() 在带有百分号的字符串中错误地检测 python-format¶

在某些情况下,带有百分号的字符串跟着一个空格和一个字符串转换换类型( string conversion type ) (例如 _("10% interest") ),:func:~django.utils.translation.gettext 会错误地使用 python-format 标记字符串.

如果试着使用已被错误标记的字符串来编译消息文件,会得到一个消息,例如" 'msgid' 和 'msgstr' 格式数量不匹配"( number of format specifications in 'msgid' and 'msgstr' does not match ),或者"'msgstr' 不是有效的 Python 格式字符串,与'msgid'不同 "( 'msgstr' is not a valid Python format string, unlike 'msgid').

要解决这个问题,可以通过添加第二个百分号来转义百分号:

from django.utils.translation import gettext as _ output = _("10%% interest")

或者可以使用非python格式( no-python-format ),这样所有百分号会被视为文字:

# xgettext:no-python-format output = _("10% interest") 从 JavaScript 源码中创建消息文件¶

您可以像处理其他 Django 消息文件一样创建和更新消息文件,使用 django-admin makemessages 工具。唯一的区别是,您需要明确指定在 gettext 术语中称为域的内容,这里是 djangojs 域,通过提供一个 -d djangojs 参数,就像这样:

django-admin makemessages -d djangojs -l de

这会创建或更新德语的JavaScript 消息文件。更新消息文件后,像执行普通 Django 消息文件那样运行 django-admin compilemessages 即可。

Windows 上的 gettext¶

仅适用于需要提取消息ID或编译消息文件(.po)的场景。翻译工作本身涉及编辑这种已存在的文件,但如果你想创建你自己的消息文件,或者想要测试或编译一个已改动的消息文件,需下载一个预编译的二进制安装器(a precompiled binary installer)。

您也可以使用从其他地方获取的 gettext 二进制文件,只要 xgettext --version 命令正常工作即可。如果在 Windows 命令提示符中输入命令 xgettext --version 时弹出窗口显示 "xgettext.exe 生成了错误并将被 Windows 关闭",请不要尝试使用 Django 的翻译工具与带有 gettext 包的系统一起使用。

自定义 makemessages 命令¶

如果要给 xgettext 传递额外的参数,则需要创建自定义的 makemessages 命令,并覆盖它的 xgettext_options 属性:

from django.core.management.commands import makemessages class Command(makemessages.Command): xgettext_options = makemessages.Command.xgettext_options + ["--keyword=mytrans"]

如果需要更多的灵活性,也可以给自定义的 makemessages 命令添加新的参数:

from django.core.management.commands import makemessages class Command(makemessages.Command): def add_arguments(self, parser): super().add_arguments(parser) parser.add_argument( "--extra-keyword", dest="xgettext_keywords", action="append", ) def handle(self, *args, **options): xgettext_keywords = options.pop("xgettext_keywords") if xgettext_keywords: self.xgettext_options = makemessages.Command.xgettext_options[:] + [ "--keyword=%s" % kwd for kwd in xgettext_keywords ] super().handle(*args, **options)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3